﻿<%@ Application Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Resources" %>
<%@ Import Namespace="System.Runtime.Remoting" %>
<%@ Import Namespace="SystemFrameworks" %>
<%@ Import Namespace="BusinessRules" %>
<%@ Import Namespace="calendar" %>
<%@ Import Namespace="Common" %>
<%@ Import Namespace="DataAccess" %>




<script runat="server">

    private static String appRoot;
    static readonly Cache _cache = HttpContext.Current.Cache;

    /// <summary>
    ///     Function to be called by Application_OnStart as described in the
    ///     class description. Initializes the application root.
    ///     <param name="myAppPath">The path of the running application.</param>
    /// </summary>
    public static void OnApplicationStart(String myAppPath)
    {
        appRoot = myAppPath;
        ConfigurationSettings.GetConfig("appSettings");
    }

    protected string DefaultPath()
    {
        string mstrPort = HttpContext.Current.Request.ServerVariables["SERVER_PORT"];
        string mstrProtocol = HttpContext.Current.Request.ServerVariables["SERVER_PORT_SECURE"];

        if (mstrPort == null || mstrPort == "80" || mstrPort == "443")
        {
            mstrPort = String.Empty;
        }
        else
        {
            mstrPort = ":" + mstrPort;
        }

        if (mstrProtocol == null || mstrProtocol == "0")
        {
            mstrProtocol = "http://";
        }
        else
        {
            mstrProtocol = "https://";
        }

        string ruta = "";
        //if (HttpContext.Current.Request.ServerVariables["SERVER_NAME"].ToString() == "localhost")
        //    ruta = ConfigurationManager.AppSettings["UrlImages"].ToString() +
        //           HttpContext.Current.Request.ApplicationPath;
        //else
            ruta = HttpContext.Current.Request.ServerVariables["SERVER_NAME"] + mstrPort + HttpContext.Current.Request.ApplicationPath;

        // *** Construccion del Url base el cual apunta  a la raiz de la aplicacion

        return mstrProtocol + ruta;

    }

    protected void Application_Start(object sender, EventArgs e)
    {

        ResourceManager rm = new CCSResourceManager("resources.strings", System.Reflection.Assembly.Load(new System.Reflection.AssemblyName("app_GlobalResources")));


        Application["rm"] = rm;
        Application["_locales"] = System.Configuration.ConfigurationManager.GetSection("locales");
        HttpContext.Current.Cache.Insert("__InvalidateAllPages", DateTime.Now, null,
                                          System.DateTime.MaxValue, System.TimeSpan.Zero,
                                          System.Web.Caching.CacheItemPriority.NotRemovable,
                                          null);
        
        OnApplicationStart(Context.Server.MapPath(Context.Request.ApplicationPath));
        string configPath = System.IO.Path.Combine(Context.Server.MapPath(Context.Request.ApplicationPath), "remotingclient.cfg");
        if (System.IO.File.Exists(configPath))
            RemotingConfiguration.Configure(configPath);

        try
        {
            CrearCacheAreas();
            //CrearCacheSecciones();
            CrearCachePaises();
            CrearCacheDepartamentos();
            CrearCacheMunicipios();

            Application[Utilidad._APPLICATION_BASE_PATH] = DefaultPath();
            Application[Utilidad._APPLICATION] = Utilidad.SistemaInformacion.SINIC;
        }
        catch (Exception ex)
        {
            throw new ApplicationExceptionManager(ex.Message, ex);
        }
    }

    protected void Application_End(object sender, EventArgs e)
    {

    }

    /// <summary>
    /// consulta los PAISES y los almacena en CACHE
    /// </summary>
    static void CrearCachePaises()
    {
        try
        {
            BasZonasGeograficas zonasPaises = new BasZonasGeograficas(ConfigurationManager.AppSettings["conn"]);

            #region Paises

            DataTable zonasPaisesData = zonasPaises.BuscarZonasPaises();

            CacheItemRemovedCallback onRemove = ZonasGeograficasRemoved;

            _cache.Insert(Utilidad._CACHE_PAISES, zonasPaisesData, null,
                DateTime.Now.AddDays(10), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);

            #endregion
        }
        catch (Exception ex)
        {
            throw new ApplicationExceptionManager(ex.Message, ex);
        }
    }
    /// CallBack que se llama cuando el cache se quita por alguna razón de memoria el cache de los municipios
    /// 
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <param name="reason"></param>
    static void ZonasGeograficasRemoved(string key, Object value, CacheItemRemovedReason reason)
    {
        if (reason == CacheItemRemovedReason.Expired)
        {
            try
            {
                switch (key)
                {
                    case Utilidad._CACHE_PAISES:
                        CrearCachePaises();
                        break;
                    case Utilidad._CACHE_DEPARTAMENTOS:
                        CrearCacheDepartamentos();
                        break;
                    case Utilidad._CACHE_MUNICIPIOS:
                        CrearCacheMunicipios();
                        break;
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationExceptionManager(ex.Message, ex);
            }
        }
    }
    /// <summary>
    /// consulta los departamentos y los almacena en CACHE
    /// </summary>
    static void CrearCacheDepartamentos()
    {
        try
        {
            BasZonasGeograficas zonasGeograficas = new BasZonasGeograficas(ConfigurationManager.AppSettings["conn"]);

            #region Departamentos

            DataAccess.BasZonasGeograficasData zonasGeograficasData = zonasGeograficas.BuscarZonasGeograficas();

            CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(ZonasGeograficasRemoved);

            _cache.Insert(Utilidad._CACHE_DEPARTAMENTOS, zonasGeograficasData, null,
                DateTime.Now.AddDays(10), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);

            #endregion
        }
        catch (Exception ex)
        {
            throw new ApplicationExceptionManager(ex.Message, ex);
        }
    }

    /// <summary>
    /// consulta los departamentos y los almacena en CACHE
    /// </summary>
    static void CrearCacheMunicipios()
    {
        try
        {
            BasZonasGeograficas zonasGeograficas = new BasZonasGeograficas(ConfigurationManager.AppSettings["conn"]);

            DataAccess.BasZonasGeograficasData zonasGeograficasData = zonasGeograficas.BuscarZonasGeograficasMunicipios();

            CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(ZonasGeograficasRemoved);

            _cache.Insert(Utilidad._CACHE_MUNICIPIOS, zonasGeograficasData, null,
                DateTime.Now.AddDays(10), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);
        }
        catch (Exception ex)
        {
            throw new ApplicationExceptionManager(ex.Message, ex);
        }
    }

    protected void Session_Start(Object sender, EventArgs e)
    {
        Session.Add("cambioclave", "n");
        Session.Add("DiasExpiracionClave", 0);
        Session.Add("DiasPreavisoExpiracionClave", 0);
        Session.Add("MaxFilasGrid", 10);
        Session.Add("CuentaAdmin", "admin");
        Session.Add("Usuario", new objUsuario());
        // Variable que almacena el NOMBRE del cache utilizado para almacenar las opciones del menu
        Session.Add(Utilidad._CACHE_OPCIONES_PERFIL, Utilidad._CACHE_OPCIONES_PERFIL + this.Session.SessionID);
    }

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {

        if (Application[Request.PhysicalPath] != null)
            Request.ContentEncoding = System.Text.Encoding.GetEncoding(Application[Request.PhysicalPath].ToString());

    }

    void Session_End(object sender, EventArgs e)
    {
        // Code that runs when a session ends. 
        // Note: The Session_End event is raised only when the sessionstate mode
        // is set to InProc in the Web.config file. If session mode is set to StateServer 
        // or SQLServer, the event is not raised.

    }

    /// CallBack que se llama cuando el cache se quita por alguna razón de memoria el cache
    /// </summary>
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <param name="reason"></param>
    static void CacheRemoved(string key, Object value, CacheItemRemovedReason reason)
    {
        if (reason == CacheItemRemovedReason.Expired)
        {
            try
            {
                switch (key)
                {
                    case Utilidad._CACHE_PAISES:
                        CrearCachePaises();
                        break;
                    case Utilidad._CACHE_DEPARTAMENTOS:
                        CrearCacheDepartamentos();
                        break;
                    case Utilidad._CACHE_MUNICIPIOS:
                        CrearCacheMunicipios();
                        break;
                    case Utilidad._CACHE_AREAS:
                    case Utilidad._CACHE_SECCIONES_SINIC:
                    case Utilidad._CACHE_SECCIONES_INFORMACION_AREA_TEMATICA:
                    case Utilidad._CACHE_DATOS_SECCION_INFORMACION_AREA_TEMATICA:
                    case Utilidad._CACHE_SECCIONES_INFORMACION_GENERAL:
                    case Utilidad._CACHE_SECCIONES_INFORMACION_SITIO:
                    case Utilidad._CACHE_SECCIONES_MODULOS:
                    case Utilidad._CACHE_SECCIONES_BUSQUEDA:
                    case Utilidad._CACHE_SECCIONES_CONSULTA_INFORMACION:
                        CrearCacheAreas();
                        CrearCacheSecciones();
                        break;
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationExceptionManager(ex.Message, ex);
            }
        }
    }

    /// <summary>
    /// consulta las secciones de cada area y las almacena en CACHE
    /// </summary>
    static void CrearCacheSecciones()
    {
        try
        {
            DataAccess.AreasData AreasData = (DataAccess.AreasData)_cache[Utilidad._CACHE_AREAS];

            #region Secciones
            Secciones secciones = new Secciones(ConfigurationManager.AppSettings["conn"]);
            DataAccess.SeccionesData seccionesData;

            foreach (DataRow row in AreasData.Rows)
            {
                Utilidad.AreasSINIC areasSinic = (Utilidad.AreasSINIC)Convert.ToInt32(row[AreasData.ARE_ID_FIELD]);

                seccionesData = secciones.BuscarSeccionesArea(row[AreasData.ARE_ID_FIELD].ToString(), Utilidad.ESTADO_ACTIVO, DateTime.Now);

                CacheItemRemovedCallback onRemove;
                switch (areasSinic)
                {
                    #region 1. Secciones SINIC

                    case Utilidad.AreasSINIC.SINIC:
                        _cache.Remove(Utilidad._CACHE_SECCIONES_SINIC);

                        onRemove = new CacheItemRemovedCallback(CacheRemoved);
                        _cache.Insert(Utilidad._CACHE_SECCIONES_SINIC, seccionesData.Tables[0], null,
                                      DateTime.Now.AddDays(100), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);
                        break;

                    #endregion

                    #region  2. Secciones Informacion Area Temática
                    case Utilidad.AreasSINIC.InformacionAreaTematica:
                        _cache.Remove(Utilidad._CACHE_SECCIONES_INFORMACION_AREA_TEMATICA);

                        onRemove = new CacheItemRemovedCallback(CacheRemoved);
                        _cache.Insert(Utilidad._CACHE_SECCIONES_INFORMACION_AREA_TEMATICA, seccionesData.Tables[0], null,
                                      DateTime.Now.AddDays(100), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);

                        #region Datos Sección Área Temática

                        DatosSecciones objDatosSecciones = new DatosSecciones(ConfigurationManager.AppSettings["conn"]);
                        DataAccess.DatosSeccionesData objDatosSeccionesData = objDatosSecciones.ConsultarDatosSecciones(Utilidad.AreasSINIC.InformacionAreaTematica);

                        _cache.Remove(Utilidad._CACHE_DATOS_SECCION_INFORMACION_AREA_TEMATICA);

                        onRemove = new CacheItemRemovedCallback(CacheRemoved);
                        _cache.Insert(Utilidad._CACHE_DATOS_SECCION_INFORMACION_AREA_TEMATICA, objDatosSeccionesData.Tables[0], null,
                                      DateTime.Now.AddDays(100), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);

                        #endregion

                        break;

                    #endregion

                    #region 3. Secciones Información General

                    case Utilidad.AreasSINIC.InformacionGeneral:
                        _cache.Remove(Utilidad._CACHE_SECCIONES_INFORMACION_GENERAL);

                        onRemove = new CacheItemRemovedCallback(CacheRemoved);
                        _cache.Insert(Utilidad._CACHE_SECCIONES_INFORMACION_GENERAL, seccionesData.Tables[0], null,
                                      DateTime.Now.AddDays(100), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);
                        break;

                    #endregion

                    #region 4. Secciones Información del sitio

                    case Utilidad.AreasSINIC.InformacionSitio:
                        _cache.Remove(Utilidad._CACHE_SECCIONES_INFORMACION_SITIO);

                        onRemove = new CacheItemRemovedCallback(CacheRemoved);
                        _cache.Insert(Utilidad._CACHE_SECCIONES_INFORMACION_SITIO, seccionesData.Tables[0], null,
                                      DateTime.Now.AddDays(100), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);
                        break;

                    #endregion

                    #region 5. Secciones Módulos

                    case Utilidad.AreasSINIC.Modulos:
                        _cache.Remove(Utilidad._CACHE_SECCIONES_MODULOS);

                        onRemove = new CacheItemRemovedCallback(CacheRemoved);
                        _cache.Insert(Utilidad._CACHE_SECCIONES_MODULOS, seccionesData.Tables[0], null,
                                      DateTime.Now.AddDays(100), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);
                        break;

                    #endregion

                    #region 6. Secciones Búsqueda

                    case Utilidad.AreasSINIC.Busqueda:
                        _cache.Remove(Utilidad._CACHE_SECCIONES_BUSQUEDA);

                        onRemove = new CacheItemRemovedCallback(CacheRemoved);
                        _cache.Insert(Utilidad._CACHE_SECCIONES_BUSQUEDA, seccionesData.Tables[0], null,
                                      DateTime.Now.AddDays(100), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);
                        break;

                    #endregion

                    #region 7. Secciones Consulta de Información
                    case Utilidad.AreasSINIC.ConsultaInformacion:
                        _cache.Remove(Utilidad._CACHE_SECCIONES_CONSULTA_INFORMACION);

                        onRemove = new CacheItemRemovedCallback(CacheRemoved);
                        _cache.Insert(Utilidad._CACHE_SECCIONES_CONSULTA_INFORMACION, seccionesData.Tables[0], null,
                                      DateTime.Now.AddDays(100), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);
                        break;

                    #endregion

                }
            }

            #endregion
        }
        catch (Exception ex)
        {
            throw new ApplicationExceptionManager(ex.Message, ex);
        }
    }

    /// <summary>
    /// consulta las areas y las almacena en CACHE
    /// </summary>
    static void CrearCacheAreas()
    {
        try
        {
            Areas areas = new Areas(ConfigurationManager.AppSettings["conn"]);

            #region Areas

            DataAccess.AreasData AreasData = areas.BuscarAreas();

            CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(CacheRemoved);

            _cache.Insert(Utilidad._CACHE_AREAS, AreasData, null,
                DateTime.Now.AddDays(100), Cache.NoSlidingExpiration, CacheItemPriority.Default, onRemove);

            #endregion
        }
        catch (Exception ex)
        {
            throw new ApplicationExceptionManager(ex.Message, ex);
        }
    }

       
</script>
